﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

typedef long long LL;

int main()
{
    //动态规划：dp[i]表示在[0...i-1]前有多少个_x（x表示a[i]）与当前的x构成_xx
    //返回值：dp表的和

    //哈希表f[26]更新前用来存储a[0...i-1]有多少个_x，更新就是用来存储a[0...i]有多少个_x
    //dp[i] = f[a[i] - 'a'] 即求出_x的数量，接上x即为新的_xx
    //由于dp并没有填表，所以优化为一个变量，存储总和就行

    //如何更新f[26]，出现了x字符，求出a[0...i-1]前有多少个非x字符，便可以与当前x字符，构成新的_x

    //g[x]更新前表示a[0...i-1]某个字符的数量，更新后表示a[0...i]某个字符的数量
    //如何更新g[x]，g[a[i] - 'a'] += 1


    LL n = 0;
    cin >> n;

    string str;
    cin >> str;

    LL f[26] = { 0 };
    LL g[26] = { 0 };
    LL result = 0;

    for (LL i = 0; i < n; ++i)
    {
        result += f[str[i] - 'a'];//求总和

        f[str[i] - 'a'] += i - g[str[i] - 'a'];//g[str[i] - 'a']在a[0...i-1]表示str[i]字符出现的次数，str[0...i-1]有i个字符，i - a[str[i] - 'a']表示在a[0...i-1]出现的非str[i]字符的个数

        g[str[i] - 'a'] += 1;//更新某个字符出现的次数
    }

    cout << result << endl;
    return 0;
}

/*
leafee 最近爱上了 abb 型语句，比如“叠词词”、“恶心心”
leafee 拿到了一个只含有小写字母的字符串，她想知道有多少个 "abb" 型的子序列？
定义： abb 型字符串满足以下条件：
字符串长度为 3 。
字符串后两位相同。
字符串前两位不同。

输入描述：
第一行一个正整数n第二行一个长度为n的字符串（只包含小写字母）1≤n≤10^5

输出描述：
"abb" 型的子序列个数。

示例1
输入：
6
abcbcc
输出：
8
说明：
共有1个abb，3个acc，4个bcc
*/

